#include "musiclist.h"

#include <QMimeDatabase>
#include <QDebug>

MusicList::MusicList()
{

}

void MusicList::addMusicByUrl(const QList<QUrl> &urls)
{
    // 将所有的⾳乐放置到musicLists
    for(auto musicUrl : urls)
    {
        // 文件重复过滤
        // 如果该文件已经在musicList中，就不在添加
        // 过滤方式：将当前将要添加到musicList中的文件的路径，与musicList中已经存在的
        //          歌曲文件路劲对比，如果相同则歌曲已经存在，如果不同说明还没有添加过，则添加、

        // 查找：最快的方式就是哈希  O(1)
        QString musicPath = musicUrl.toLocalFile();
        qDebug() << musicPath << endl;
//        musicPath[0] = 'e';

        if(musicPaths.contains(musicPath))  //数据库的是小e，重新添加的是大E导致可以重复添加
        {
            qDebug() << "添加过" <<endl;
            continue;
        }
        musicPaths.insert(musicPath);

        // 由于添加进来的⽂件不⼀定是歌曲⽂件，因此需要再次筛选出⾳乐⽂件
        QMimeDatabase db;
        QMimeType mime = db.mimeTypeForFile(musicUrl.toLocalFile());
        if(mime.name() != "audio/mpeg" && mime.name() != "audio/flac")
        {
            continue;
        }

        // 如果是⾳乐⽂件，加⼊歌曲列表
        musicList.push_back(musicUrl);
    }
}

void MusicList::writeToDB()
{
    for(auto music : musicList)
    {
        music.insertMusicToDB();
    }
}

void MusicList::readFromDB()
{
    QSqlQuery query;
    query.prepare("SELECT musicId, musicName, musicSinger, albumName,duration, musicUrl, isLike, isHistory FROM musicInfo");
    if(!query.exec())
    {
        qDebug()<<"数据库查询失败:"<<query.lastError().text();
        return ;
    }

    while(query.next())
    {
        Song music;
        music.setMusicId(query.value(0).toString());
        music.setMusicName(query.value(1).toString());
        music.setMusicSingerName(query.value(2).toString());
        music.setAlbumName(query.value(3).toString());
        music.setDuration(query.value(4).toLongLong());
        music.setMusicUrl("file:///"+query.value(5).toString());    //解决重新启动还是会添加重复文件
        music.setIsLike(query.value(6).toBool());
        music.setHistory(query.value(7).toBool());

        // 恢复musicPaths，目的防止相同目录下的歌曲被重复加载
        musicPaths.insert(music.getMusicUrl().toLocalFile());

        qDebug() << music.getMusicId();
        qDebug() << music.getMusicName();
        qDebug() << music.getSingerName();
        qDebug() << music.getAlbumName();
        qDebug() << music.getDuration();
        qDebug() << music.getMusicUrl();
        qDebug() << music.getIsLike();
        qDebug() << music.getIsHistory();

        musicList.push_back(music);
    }
}

iterator MusicList::begin()
{
    return musicList.begin();
}

iterator MusicList::end()
{
    return musicList.end();
}

iterator MusicList::findMusicById(const QString &musicId)
{
    for(iterator it = begin();it != end();++it)
    {
        if(it->getMusicId() == musicId)
        {
            return it;
        }
    }
    return end();
}
